Confidence Levels

https://htmlpreview.github.io/?https://github.com/jbryer/DATA606/blob/master/inst/labs/Lab6/Lab6_inf_for_categorical_data.html

library(tidyverse)
library(openintro)
library(infer)
library(psych)
library(gghighlight)

Exercise 1

yrbss %>%
  summary
##       age           gender             grade             hispanic        
##  Min.   :12.00   Length:13583       Length:13583       Length:13583      
##  1st Qu.:15.00   Class :character   Class :character   Class :character  
##  Median :16.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :16.16                                                           
##  3rd Qu.:17.00                                                           
##  Max.   :18.00                                                           
##  NA's   :77                                                              
##      race               height          weight        helmet_12m       
##  Length:13583       Min.   :1.270   Min.   : 29.94   Length:13583      
##  Class :character   1st Qu.:1.600   1st Qu.: 56.25   Class :character  
##  Mode  :character   Median :1.680   Median : 64.41   Mode  :character  
##                     Mean   :1.691   Mean   : 67.91                     
##                     3rd Qu.:1.780   3rd Qu.: 76.20                     
##                     Max.   :2.110   Max.   :180.99                     
##                     NA's   :1004    NA's   :1004                       
##  text_while_driving_30d physically_active_7d hours_tv_per_school_day
##  Length:13583           Min.   :0.000        Length:13583           
##  Class :character       1st Qu.:2.000        Class :character       
##  Mode  :character       Median :4.000        Mode  :character       
##                         Mean   :3.903                               
##                         3rd Qu.:7.000                               
##                         Max.   :7.000                               
##                         NA's   :273                                 
##  strength_training_7d school_night_hours_sleep
##  Min.   :0.00         Length:13583            
##  1st Qu.:0.00         Class :character        
##  Median :3.00         Mode  :character        
##  Mean   :2.95                                 
##  3rd Qu.:5.00                                 
##  Max.   :7.00                                 
##  NA's   :1176
yrbss %>%
  count(text_while_driving_30d)
## # A tibble: 9 × 2
##   text_while_driving_30d     n
##   <chr>                  <int>
## 1 0                       4792
## 2 1-2                      925
## 3 10-19                    373
## 4 20-29                    298
## 5 3-5                      493
## 6 30                       827
## 7 6-9                      311
## 8 did not drive           4646
## 9 <NA>                     918

Exercise 2

getProportions <- function(data) {
  data <- data %>%
    select(text_ind) %>%
    count(text_ind) %>%
    mutate(p = n / sum(n)) %>%
    select(text_ind, n, p)
  
  print(data)
  return(data)
}
neverType = "never"
type30 = "30"
yesLabel = "yes"
noLabel = "no"
nLabel = "n"



no_helmet <- yrbss %>%
  filter(helmet_12m == neverType) %>%
  mutate(text_ind = ifelse(!is.na(text_while_driving_30d) 
                           & text_while_driving_30d == type30, yesLabel, noLabel))

no_helmetProportions <- no_helmet %>%
  getProportions
## # A tibble: 2 × 3
##   text_ind     n      p
##   <chr>    <int>  <dbl>
## 1 no        6514 0.934 
## 2 yes        463 0.0664
#overall <- yrbss %>%
#  mutate(text_ind = ifelse(!is.na(text_while_driving_30d) 
#                           & text_while_driving_30d == type30 
#                           & !is.na(helmet_12m)
#                           & helmet_12m == neverType, yesLabel, noLabel)) %>%
#  getProportions

Exercise 3

analyzeConfidenceInterval <- function(sample, reps = 1000, yes = TRUE, level = 0.95, print = TRUE) {
  interval <- sample %>%
    specify(response = text_ind, success = ifelse (yes, yesLabel, noLabel)) %>%
    generate(reps = reps, type = "bootstrap") %>%
    calculate(stat = "prop") %>%
    get_ci(level = level)
  
  if (print) { 
    print(interval)
    print(c(interval$upper_ci, interval$lower_ci) %>%
            describe)
  }
  
  return(interval)
}
analyzeSamplingProportionDistribution <- function(sample, size = NULL, reps = 15000, binwidth = .01, yes = TRUE) {
  size <- ifelse(is.null(size), nrow(sample), size)
    
  sizedSamples <- sample %>%
    rep_sample_n(size = size, reps = reps, replace = TRUE) %>%
    count(text_ind) %>%
    mutate(p_hat = n /sum(n))
  
  typeLabel <- ifelse(yes, yesLabel, notLabel)
  
  filteredSamples <- sizedSamples %>%
    filter(text_ind == typeLabel)
  
  print(ggplot(data = filteredSamples, aes(x = p_hat)) +
    geom_histogram(binwidth = binwidth) +
    labs(
      x = paste("p_hat (", typeLabel, ")", sep = ""),
      title = "Sampling distribution of p_hat",
      subtitle = paste("Sample size = ", size, "; Number of samples = ", reps, "; Bin width = ", binwidth, sep = "")
    ))
  
  print(filteredSamples)
  print(filteredSamples$p_hat %>%
    describe)
  
  print(sizedSamples$n %>%
    sum)
  
  return(sizedSamples)
}
analyzeMarginOfError <- function(n, p, decimals = 3) {
  me <- 2 * sqrt(p * (1 - p) / n)
  print(paste("Margin of Error: ", me, sep = ""))
  
  binwidth = 1/ 10 ^ decimals
  pList <- seq(from = 0, to = 1, by = binwidth)
  meList <- 2 * sqrt(pList * (1 - pList) / n)

  dd <- data.frame(proportion = pList, marginOfError = meList)
  print(ggplot(data = dd, aes(x = proportion, y = marginOfError)) +
          geom_point() +
          gghighlight(proportion == round(p, digits = decimals), label_key = marginOfError) +
          labs(x = "Population Proportion", 
               y = "Margin of Error",
               title = paste("Sample size = ", n, "; Proportion = ", p, "; Bin width = ", binwidth, sep = "")))
  
  return(me)
}

analyzeMarginOfErrorData <- function(data, row = "yes",  size = NULL, reps = 15000, binwidth = .01, yes = TRUE, distribute = TRUE) {
  filteredData <- data %>%
    getProportions %>%
    filter(text_ind == row)
    
  me <- analyzeMarginOfError(filteredData[[2]], filteredData[[3]])
    
  if(distribute) {
    proportionDistribution <- data %>%
      analyzeSamplingProportionDistribution(size, reps, binwidth, yes)
  }
  
  return(me)
}
interval95 <- no_helmet %>%
  analyzeConfidenceInterval
## # A tibble: 1 × 2
##   lower_ci upper_ci
##      <dbl>    <dbl>
## 1   0.0606   0.0727
##    vars n mean   sd median trimmed  mad  min  max range skew kurtosis   se
## X1    1 2 0.07 0.01   0.07    0.07 0.01 0.06 0.07  0.01    0    -2.75 0.01
print(no_helmet)
## # A tibble: 6,977 × 14
##      age gender grade hispanic race    height weight helmet_12m text_while_driv…
##    <int> <chr>  <chr> <chr>    <chr>    <dbl>  <dbl> <chr>      <chr>           
##  1    14 female 9     not      Black …  NA      NA   never      0               
##  2    14 female 9     not      Black …  NA      NA   never      <NA>            
##  3    15 female 9     hispanic Native…   1.73   84.4 never      30              
##  4    15 female 9     not      Black …   1.6    55.8 never      0               
##  5    14 male   9     not      Black …   1.88   71.2 never      <NA>            
##  6    15 male   9     not      Black …   1.75   63.5 never      <NA>            
##  7    16 male   9     not      Black …   1.68   74.8 never      0               
##  8    14 male   9     not      Black …   1.73   73.5 never      did not drive   
##  9    15 male   9     not      Black …   1.83   67.6 never      0               
## 10    16 male   9     not      Black …   1.83   73.5 never      did not drive   
## # … with 6,967 more rows, and 5 more variables: physically_active_7d <int>,
## #   hours_tv_per_school_day <chr>, strength_training_7d <int>,
## #   school_night_hours_sleep <chr>, text_ind <chr>
me <- no_helmet %>%
  analyzeMarginOfErrorData(distribute = FALSE)
## # A tibble: 2 × 3
##   text_ind     n      p
##   <chr>    <int>  <dbl>
## 1 no        6514 0.934 
## 2 yes        463 0.0664
## [1] "Margin of Error: 0.0231358334802707"

Exercise 6

The resulting distribution is unimodal and without a skew centered around the given proportion

numOfElements = 300
proportion = .1

data = tibble(
  text_ind = c(rep(yesLabel, numOfElements * proportion), rep(noLabel, numOfElements * (1 - proportion)))
)



me <- data %>%
  analyzeMarginOfErrorData
## # A tibble: 2 × 3
##   text_ind     n     p
##   <chr>    <int> <dbl>
## 1 no         270   0.9
## 2 yes         30   0.1
## [1] "Margin of Error: 0.109544511501033"

## # A tibble: 15,000 × 4
## # Groups:   replicate [15,000]
##    replicate text_ind     n  p_hat
##        <int> <chr>    <int>  <dbl>
##  1         1 yes         26 0.0867
##  2         2 yes         27 0.09  
##  3         3 yes         39 0.13  
##  4         4 yes         28 0.0933
##  5         5 yes         37 0.123 
##  6         6 yes         29 0.0967
##  7         7 yes         26 0.0867
##  8         8 yes         30 0.1   
##  9         9 yes         39 0.13  
## 10        10 yes         30 0.1   
## # … with 14,990 more rows
##    vars     n mean   sd median trimmed  mad  min  max range skew kurtosis se
## X1    1 15000  0.1 0.02    0.1     0.1 0.02 0.04 0.18  0.13 0.15    -0.03  0
## [1] 4500000

Exercise 7

The shape and center remains fairly consistent as unimodal and without a skew centered around the given proportion, but the margin of error increases starting from 0 at 0% proportion until it reaches 50% where it achieves its max before decreasing back down to 0 at 100%

minisculeProportion = .01
tinyProportion = .2
smallProportion = .40
mediumProportion = .60
largeProportion = .80
massiveProportion = .99

smallBinwidth = .001

minisculeData = tibble(
  text_ind = c(rep(yesLabel, numOfElements * minisculeProportion), rep(noLabel, numOfElements * (1 - minisculeProportion)))
)

tinyData = tibble(
  text_ind = c(rep(yesLabel, numOfElements * tinyProportion), rep(noLabel, numOfElements * (1 - tinyProportion)))
)
  
smallData = tibble(
  text_ind = c(rep(yesLabel, numOfElements * smallProportion), rep(noLabel, numOfElements * (1 - smallProportion)))
)

mediumData = tibble(
  text_ind = c(rep(yesLabel, numOfElements * mediumProportion), rep(noLabel, numOfElements * (1 - mediumProportion)))
)

largeData = tibble(
  text_ind = c(rep(yesLabel, numOfElements * largeProportion), rep(noLabel, numOfElements * (1 - largeProportion)))
)

massiveData = tibble(
  text_ind = c(rep(yesLabel, numOfElements * massiveProportion), rep(noLabel, numOfElements * (1 - massiveProportion)))
)



me <- minisculeData %>%
  analyzeMarginOfErrorData(binwidth = smallBinwidth)
## # A tibble: 2 × 3
##   text_ind     n     p
##   <chr>    <int> <dbl>
## 1 no         297  0.99
## 2 yes          3  0.01
## [1] "Margin of Error: 0.114891252930761"

## # A tibble: 14,285 × 4
## # Groups:   replicate [14,285]
##    replicate text_ind     n   p_hat
##        <int> <chr>    <int>   <dbl>
##  1         1 yes          4 0.0133 
##  2         2 yes          1 0.00333
##  3         3 yes          3 0.01   
##  4         4 yes          2 0.00667
##  5         5 yes          5 0.0167 
##  6         6 yes          4 0.0133 
##  7         7 yes          5 0.0167 
##  8         8 yes          4 0.0133 
##  9         9 yes          1 0.00333
## 10        10 yes          4 0.0133 
## # … with 14,275 more rows
##    vars     n mean   sd median trimmed mad min  max range skew kurtosis se
## X1    1 14285 0.01 0.01   0.01    0.01   0   0 0.05  0.04  0.8     0.67  0
## [1] 4500000
me <- tinyData %>%
  analyzeMarginOfErrorData
## # A tibble: 2 × 3
##   text_ind     n     p
##   <chr>    <int> <dbl>
## 1 no         240   0.8
## 2 yes         60   0.2
## [1] "Margin of Error: 0.103279555898864"

## # A tibble: 15,000 × 4
## # Groups:   replicate [15,000]
##    replicate text_ind     n p_hat
##        <int> <chr>    <int> <dbl>
##  1         1 yes         73 0.243
##  2         2 yes         69 0.23 
##  3         3 yes         63 0.21 
##  4         4 yes         62 0.207
##  5         5 yes         59 0.197
##  6         6 yes         66 0.22 
##  7         7 yes         61 0.203
##  8         8 yes         58 0.193
##  9         9 yes         59 0.197
## 10        10 yes         65 0.217
## # … with 14,990 more rows
##    vars     n mean   sd median trimmed  mad  min  max range skew kurtosis se
## X1    1 15000  0.2 0.02    0.2     0.2 0.02 0.11 0.28  0.17 0.09    -0.08  0
## [1] 4500000
me <- smallData %>%
  analyzeMarginOfErrorData
## # A tibble: 2 × 3
##   text_ind     n     p
##   <chr>    <int> <dbl>
## 1 no         180   0.6
## 2 yes        120   0.4
## [1] "Margin of Error: 0.0894427190999916"

## # A tibble: 15,000 × 4
## # Groups:   replicate [15,000]
##    replicate text_ind     n p_hat
##        <int> <chr>    <int> <dbl>
##  1         1 yes        117 0.39 
##  2         2 yes        120 0.4  
##  3         3 yes        118 0.393
##  4         4 yes        115 0.383
##  5         5 yes        128 0.427
##  6         6 yes        111 0.37 
##  7         7 yes        140 0.467
##  8         8 yes        125 0.417
##  9         9 yes        118 0.393
## 10        10 yes        119 0.397
## # … with 14,990 more rows
##    vars     n mean   sd median trimmed  mad min  max range skew kurtosis se
## X1    1 15000  0.4 0.03    0.4     0.4 0.03 0.3 0.52  0.22 0.06     0.02  0
## [1] 4500000
me <- mediumData %>%
  analyzeMarginOfErrorData
## # A tibble: 2 × 3
##   text_ind     n     p
##   <chr>    <int> <dbl>
## 1 no         120   0.4
## 2 yes        180   0.6
## [1] "Margin of Error: 0.0730296743340221"

## # A tibble: 15,000 × 4
## # Groups:   replicate [15,000]
##    replicate text_ind     n p_hat
##        <int> <chr>    <int> <dbl>
##  1         1 yes        184 0.613
##  2         2 yes        171 0.57 
##  3         3 yes        182 0.607
##  4         4 yes        193 0.643
##  5         5 yes        179 0.597
##  6         6 yes        176 0.587
##  7         7 yes        165 0.55 
##  8         8 yes        176 0.587
##  9         9 yes        185 0.617
## 10        10 yes        181 0.603
## # … with 14,990 more rows
##    vars     n mean   sd median trimmed  mad  min  max range  skew kurtosis se
## X1    1 15000  0.6 0.03    0.6     0.6 0.03 0.49 0.71  0.22 -0.03    -0.15  0
## [1] 4500000
me <- largeData %>%
  analyzeMarginOfErrorData
## # A tibble: 2 × 3
##   text_ind     n     p
##   <chr>    <int> <dbl>
## 1 no          59 0.197
## 2 yes        240 0.803
## [1] "Margin of Error: 0.0513789013235358"

## # A tibble: 15,000 × 4
## # Groups:   replicate [15,000]
##    replicate text_ind     n p_hat
##        <int> <chr>    <int> <dbl>
##  1         1 yes        228 0.763
##  2         2 yes        235 0.786
##  3         3 yes        248 0.829
##  4         4 yes        248 0.829
##  5         5 yes        242 0.809
##  6         6 yes        245 0.819
##  7         7 yes        240 0.803
##  8         8 yes        245 0.819
##  9         9 yes        245 0.819
## 10        10 yes        244 0.816
## # … with 14,990 more rows
##    vars     n mean   sd median trimmed  mad min max range  skew kurtosis se
## X1    1 15000  0.8 0.02    0.8     0.8 0.02 0.7 0.9  0.19 -0.08     0.01  0
## [1] 4485000
me <- massiveData %>%
  analyzeMarginOfErrorData(binwidth = smallBinwidth)
## # A tibble: 2 × 3
##   text_ind     n     p
##   <chr>    <int> <dbl>
## 1 no           3  0.01
## 2 yes        297  0.99
## [1] "Margin of Error: 0.0115470053837925"

## # A tibble: 15,000 × 4
## # Groups:   replicate [15,000]
##    replicate text_ind     n p_hat
##        <int> <chr>    <int> <dbl>
##  1         1 yes        299 0.997
##  2         2 yes        294 0.98 
##  3         3 yes        298 0.993
##  4         4 yes        299 0.997
##  5         5 yes        298 0.993
##  6         6 yes        297 0.99 
##  7         7 yes        295 0.983
##  8         8 yes        300 1    
##  9         9 yes        298 0.993
## 10        10 yes        295 0.983
## # … with 14,990 more rows
##    vars     n mean   sd median trimmed mad  min max range  skew kurtosis se
## X1    1 15000 0.99 0.01   0.99    0.99   0 0.96   1  0.04 -0.56     0.34  0
## [1] 4500000

Exercise 8

The margin of error decreases as n increases

tinyNumOfElements = 10
smallNumOfElements = 50
mediumNumOfElements = 100
largeNumOfElements = 1000
massiveNumOfElements = 10000

largeBinwidth = .1
mediumBinwidth = .02

tinyData = tibble(
  text_ind = c(rep(yesLabel, tinyNumOfElements * proportion), rep(noLabel, tinyNumOfElements * (1 - proportion)))
)
  
smallData = tibble(
  text_ind = c(rep(yesLabel, smallNumOfElements * proportion), rep(noLabel, smallNumOfElements * (1 - proportion)))
)

mediumData = tibble(
  text_ind = c(rep(yesLabel, mediumNumOfElements * proportion), rep(noLabel, mediumNumOfElements * (1 - proportion)))
)

largeData = tibble(
  text_ind = c(rep(yesLabel, largeNumOfElements * proportion), rep(noLabel, largeNumOfElements * (1 - proportion)))
)

massiveData = tibble(
  text_ind = c(rep(yesLabel, massiveNumOfElements * proportion), rep(noLabel, massiveNumOfElements * (1 - proportion)))
)



me <- tinyData %>%
  analyzeMarginOfErrorData(binwidth = largeBinwidth)
## # A tibble: 2 × 3
##   text_ind     n     p
##   <chr>    <int> <dbl>
## 1 no           9   0.9
## 2 yes          1   0.1
## [1] "Margin of Error: 0.6"

## # A tibble: 9,721 × 4
## # Groups:   replicate [9,721]
##    replicate text_ind     n p_hat
##        <int> <chr>    <int> <dbl>
##  1         1 yes          1   0.1
##  2         4 yes          2   0.2
##  3         5 yes          1   0.1
##  4         6 yes          2   0.2
##  5         7 yes          1   0.1
##  6         8 yes          1   0.1
##  7         9 yes          1   0.1
##  8        10 yes          2   0.2
##  9        12 yes          1   0.1
## 10        13 yes          1   0.1
## # … with 9,711 more rows
##    vars    n mean   sd median trimmed mad min max range skew kurtosis se
## X1    1 9721 0.15 0.07    0.1    0.14   0 0.1 0.6   0.5 1.35     1.57  0
## [1] 150000
me <- smallData %>%
  analyzeMarginOfErrorData(binwidth = mediumBinwidth)
## # A tibble: 2 × 3
##   text_ind     n     p
##   <chr>    <int> <dbl>
## 1 no          45   0.9
## 2 yes          5   0.1
## [1] "Margin of Error: 0.268328157299975"

## # A tibble: 14,919 × 4
## # Groups:   replicate [14,919]
##    replicate text_ind     n p_hat
##        <int> <chr>    <int> <dbl>
##  1         1 yes          8  0.16
##  2         2 yes          5  0.1 
##  3         3 yes          8  0.16
##  4         4 yes          5  0.1 
##  5         5 yes          6  0.12
##  6         6 yes          5  0.1 
##  7         7 yes          8  0.16
##  8         8 yes          7  0.14
##  9         9 yes          3  0.06
## 10        10 yes          6  0.12
## # … with 14,909 more rows
##    vars     n mean   sd median trimmed  mad  min max range skew kurtosis se
## X1    1 14919  0.1 0.04    0.1     0.1 0.03 0.02 0.3  0.28  0.4     0.03  0
## [1] 750000
me <- mediumData %>%
  analyzeMarginOfErrorData
## # A tibble: 2 × 3
##   text_ind     n     p
##   <chr>    <int> <dbl>
## 1 no          90   0.9
## 2 yes         10   0.1
## [1] "Margin of Error: 0.189736659610103"

## # A tibble: 15,000 × 4
## # Groups:   replicate [15,000]
##    replicate text_ind     n p_hat
##        <int> <chr>    <int> <dbl>
##  1         1 yes          5  0.05
##  2         2 yes          4  0.04
##  3         3 yes         15  0.15
##  4         4 yes          4  0.04
##  5         5 yes          5  0.05
##  6         6 yes         13  0.13
##  7         7 yes         10  0.1 
##  8         8 yes         12  0.12
##  9         9 yes         15  0.15
## 10        10 yes          4  0.04
## # … with 14,990 more rows
##    vars     n mean   sd median trimmed  mad  min  max range skew kurtosis se
## X1    1 15000  0.1 0.03    0.1     0.1 0.03 0.01 0.24  0.23 0.26     0.03  0
## [1] 1500000
me <- largeData %>%
  analyzeMarginOfErrorData(binwidth = smallBinwidth)
## # A tibble: 2 × 3
##   text_ind     n     p
##   <chr>    <int> <dbl>
## 1 no         900   0.9
## 2 yes        100   0.1
## [1] "Margin of Error: 0.06"

## # A tibble: 15,000 × 4
## # Groups:   replicate [15,000]
##    replicate text_ind     n p_hat
##        <int> <chr>    <int> <dbl>
##  1         1 yes         96 0.096
##  2         2 yes        101 0.101
##  3         3 yes         83 0.083
##  4         4 yes        109 0.109
##  5         5 yes        101 0.101
##  6         6 yes         99 0.099
##  7         7 yes        101 0.101
##  8         8 yes         97 0.097
##  9         9 yes         92 0.092
## 10        10 yes         99 0.099
## # … with 14,990 more rows
##    vars     n mean   sd median trimmed  mad  min  max range skew kurtosis se
## X1    1 15000  0.1 0.01    0.1     0.1 0.01 0.06 0.14  0.08 0.11     0.03  0
## [1] 15000000
me <- massiveData %>%
  analyzeMarginOfErrorData(binwidth = smallBinwidth)
## # A tibble: 2 × 3
##   text_ind     n     p
##   <chr>    <int> <dbl>
## 1 no        9000   0.9
## 2 yes       1000   0.1
## [1] "Margin of Error: 0.0189736659610103"

## # A tibble: 15,000 × 4
## # Groups:   replicate [15,000]
##    replicate text_ind     n  p_hat
##        <int> <chr>    <int>  <dbl>
##  1         1 yes        999 0.0999
##  2         2 yes       1001 0.100 
##  3         3 yes       1029 0.103 
##  4         4 yes       1036 0.104 
##  5         5 yes       1008 0.101 
##  6         6 yes       1007 0.101 
##  7         7 yes       1019 0.102 
##  8         8 yes       1048 0.105 
##  9         9 yes        970 0.097 
## 10        10 yes        964 0.0964
## # … with 14,990 more rows
##    vars     n mean sd median trimmed mad  min  max range skew kurtosis se
## X1    1 15000  0.1  0    0.1     0.1   0 0.09 0.11  0.02 0.04     0.06  0
## [1] 150000000

Exercise 9

Of those that sleep more than 10 hours, we can say with 95% confidence that about 27% of them work out every day. This is a significant relationship given that the only other prevalent pattern observed is 0 days at 31%.

Ho: Those who sleep 10+ hours per day are NOT more likely to strength train every day of the week Ha: Those who sleep 10+ hours per day are more likely to strength train every day of the week

type7 = "7"
type10Plus <- "10+"
binwidth = .0003



#exerciseEveryday <- yrbss %>%
#  mutate(text_ind = ifelse(!is.na(strength_training_7d)
#                           & strength_training_7d == type7, yesLabel, noLabel))
#
#exerciseEverydayMarginOfError <- exerciseEveryday %>%
#  analyzeMarginOfErrorData(binwidth = binwidth)
#
#exerciseEverydayConfidenceInerval <- exerciseEveryday %>%
#  analyzeConfidenceInterval




#sleep10OrMoreHours <- yrbss %>%
#  mutate(text_ind = ifelse(!is.na(school_night_hours_sleep)
#                           & school_night_hours_sleep == type10Plus, yesLabel, noLabel))
#
#sleep10OrMoreHoursMarginOfError <- sleep10OrMoreHours %>%
#  analyzeMarginOfErrorData(binwidth = binwidth)
#
#sleep10OrMoreHoursConfidenceInerval <- sleep10OrMoreHours %>%
#  analyzeConfidenceInterval



exerciseEverydayAndSleep10OrMoreHours <- yrbss %>%
  filter(strength_training_7d == type7) %>%
  mutate(text_ind = ifelse(!is.na(school_night_hours_sleep)
                           & school_night_hours_sleep == type10Plus, yesLabel, noLabel))

exerciseEverydayAndSleep10OrMoreHoursMarginOfError <- exerciseEverydayAndSleep10OrMoreHours %>%
  analyzeMarginOfErrorData(binwidth = smallBinwidth)
## # A tibble: 2 × 3
##   text_ind     n      p
##   <chr>    <int>  <dbl>
## 1 no        2001 0.960 
## 2 yes         84 0.0403
## [1] "Margin of Error: 0.0429089098251224"

## # A tibble: 15,000 × 4
## # Groups:   replicate [15,000]
##    replicate text_ind     n  p_hat
##        <int> <chr>    <int>  <dbl>
##  1         1 yes         92 0.0441
##  2         2 yes         74 0.0355
##  3         3 yes         91 0.0436
##  4         4 yes         84 0.0403
##  5         5 yes         80 0.0384
##  6         6 yes         82 0.0393
##  7         7 yes         85 0.0408
##  8         8 yes         94 0.0451
##  9         9 yes         78 0.0374
## 10        10 yes         92 0.0441
## # … with 14,990 more rows
##    vars     n mean sd median trimmed mad  min  max range skew kurtosis se
## X1    1 15000 0.04  0   0.04    0.04   0 0.02 0.06  0.03 0.11    -0.03  0
## [1] 31275000
exerciseEverydayAndSleep10OrMoreHoursConfidenceInerval <- exerciseEverydayAndSleep10OrMoreHours %>%
  analyzeConfidenceInterval
## # A tibble: 1 × 2
##   lower_ci upper_ci
##      <dbl>    <dbl>
## 1   0.0312   0.0489
##    vars n mean   sd median trimmed  mad  min  max range skew kurtosis   se
## X1    1 2 0.04 0.01   0.04    0.04 0.01 0.03 0.05  0.02    0    -2.75 0.01
sleep10OrMoreHoursAndExerciseEveryday <- yrbss %>%
  filter(school_night_hours_sleep == type10Plus) %>%
  mutate(text_ind = ifelse(!is.na(strength_training_7d)
                           & strength_training_7d == type7, yesLabel, noLabel))

sleep10OrMoreHoursAndExerciseEverydayMarginOfError <- sleep10OrMoreHoursAndExerciseEveryday %>%
  analyzeMarginOfErrorData
## # A tibble: 2 × 3
##   text_ind     n     p
##   <chr>    <int> <dbl>
## 1 no         232 0.734
## 2 yes         84 0.266
## [1] "Margin of Error: 0.0964021912134672"

## # A tibble: 15,000 × 4
## # Groups:   replicate [15,000]
##    replicate text_ind     n p_hat
##        <int> <chr>    <int> <dbl>
##  1         1 yes         95 0.301
##  2         2 yes         88 0.278
##  3         3 yes         88 0.278
##  4         4 yes         97 0.307
##  5         5 yes         90 0.285
##  6         6 yes         83 0.263
##  7         7 yes         75 0.237
##  8         8 yes         87 0.275
##  9         9 yes         86 0.272
## 10        10 yes         91 0.288
## # … with 14,990 more rows
##    vars     n mean   sd median trimmed  mad  min  max range skew kurtosis se
## X1    1 15000 0.27 0.02   0.27    0.27 0.02 0.16 0.36   0.2 0.02    -0.02  0
## [1] 4740000
sleep10OrMoreHoursAndExerciseEverydayConfidenceInerval <- sleep10OrMoreHoursAndExerciseEveryday %>%
  analyzeConfidenceInterval
## # A tibble: 1 × 2
##   lower_ci upper_ci
##      <dbl>    <dbl>
## 1    0.222    0.316
##    vars n mean   sd median trimmed  mad  min  max range skew kurtosis   se
## X1    1 2 0.27 0.07   0.27    0.27 0.07 0.22 0.32  0.09    0    -2.75 0.05
sleep10OrMoreHoursAndExerciseEveryday %>%
    select(strength_training_7d) %>%
    count(strength_training_7d) %>%
    mutate(p = n / sum(n)) %>%
    select(strength_training_7d, n, p)
## # A tibble: 9 × 3
##   strength_training_7d     n      p
##                  <int> <int>  <dbl>
## 1                    0   100 0.316 
## 2                    1    17 0.0538
## 3                    2    31 0.0981
## 4                    3    31 0.0981
## 5                    4    18 0.0570
## 6                    5    23 0.0728
## 7                    6     8 0.0253
## 8                    7    84 0.266 
## 9                   NA     4 0.0127

Exercise 10

The null hypothesis is rejected when the p value is less than or equal to the significance level, which in this case is .05, or 5%. It represents how often we might mistakenly accept the null hypothesis in this scenario

Exercise 11

Using a proportion of 50% to get the highest possible sample size and a margin of error of 1%, our ideal sample size would be 9604

((1.96 ^ 2) * (0.5 * 0.5)) / 0.01 ^ 2 
## [1] 9604
LS0tCnRpdGxlOiAiREFUQSA2MDYgLSBMYWIgNiAtIEluZmVyZW5jZSBmb3IgQ2F0ZWdvcmljYWwgRGF0YSIKYXV0aG9yOiAiUHJlc3RvbiBQZWNrIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0Ci0tLQoKIyBDb25maWRlbmNlIExldmVscwoKPGh0dHBzOi8vaHRtbHByZXZpZXcuZ2l0aHViLmlvLz9odHRwczovL2dpdGh1Yi5jb20vamJyeWVyL0RBVEE2MDYvYmxvYi9tYXN0ZXIvaW5zdC9sYWJzL0xhYjYvTGFiNl9pbmZfZm9yX2NhdGVnb3JpY2FsX2RhdGEuaHRtbD4KCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KG9wZW5pbnRybykKbGlicmFyeShpbmZlcikKbGlicmFyeShwc3ljaCkKbGlicmFyeShnZ2hpZ2hsaWdodCkKYGBgCgojIyMgRXhlcmNpc2UgMQpgYGB7cn0KeXJic3MgJT4lCiAgc3VtbWFyeQoKeXJic3MgJT4lCiAgY291bnQodGV4dF93aGlsZV9kcml2aW5nXzMwZCkKYGBgCgojIyMgRXhlcmNpc2UgMgpgYGB7cn0KZ2V0UHJvcG9ydGlvbnMgPC0gZnVuY3Rpb24oZGF0YSkgewogIGRhdGEgPC0gZGF0YSAlPiUKICAgIHNlbGVjdCh0ZXh0X2luZCkgJT4lCiAgICBjb3VudCh0ZXh0X2luZCkgJT4lCiAgICBtdXRhdGUocCA9IG4gLyBzdW0obikpICU+JQogICAgc2VsZWN0KHRleHRfaW5kLCBuLCBwKQogIAogIHByaW50KGRhdGEpCiAgcmV0dXJuKGRhdGEpCn0KYGBgCgpgYGB7cn0KbmV2ZXJUeXBlID0gIm5ldmVyIgp0eXBlMzAgPSAiMzAiCnllc0xhYmVsID0gInllcyIKbm9MYWJlbCA9ICJubyIKbkxhYmVsID0gIm4iCgoKCm5vX2hlbG1ldCA8LSB5cmJzcyAlPiUKICBmaWx0ZXIoaGVsbWV0XzEybSA9PSBuZXZlclR5cGUpICU+JQogIG11dGF0ZSh0ZXh0X2luZCA9IGlmZWxzZSghaXMubmEodGV4dF93aGlsZV9kcml2aW5nXzMwZCkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICYgdGV4dF93aGlsZV9kcml2aW5nXzMwZCA9PSB0eXBlMzAsIHllc0xhYmVsLCBub0xhYmVsKSkKCm5vX2hlbG1ldFByb3BvcnRpb25zIDwtIG5vX2hlbG1ldCAlPiUKICBnZXRQcm9wb3J0aW9ucwoKCgojb3ZlcmFsbCA8LSB5cmJzcyAlPiUKIyAgbXV0YXRlKHRleHRfaW5kID0gaWZlbHNlKCFpcy5uYSh0ZXh0X3doaWxlX2RyaXZpbmdfMzBkKSAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICYgdGV4dF93aGlsZV9kcml2aW5nXzMwZCA9PSB0eXBlMzAgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAmICFpcy5uYShoZWxtZXRfMTJtKQojICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBoZWxtZXRfMTJtID09IG5ldmVyVHlwZSwgeWVzTGFiZWwsIG5vTGFiZWwpKSAlPiUKIyAgZ2V0UHJvcG9ydGlvbnMKYGBgCgojIyMgRXhlcmNpc2UgMwpgYGB7cn0KYW5hbHl6ZUNvbmZpZGVuY2VJbnRlcnZhbCA8LSBmdW5jdGlvbihzYW1wbGUsIHJlcHMgPSAxMDAwLCB5ZXMgPSBUUlVFLCBsZXZlbCA9IDAuOTUsIHByaW50ID0gVFJVRSkgewogIGludGVydmFsIDwtIHNhbXBsZSAlPiUKICAgIHNwZWNpZnkocmVzcG9uc2UgPSB0ZXh0X2luZCwgc3VjY2VzcyA9IGlmZWxzZSAoeWVzLCB5ZXNMYWJlbCwgbm9MYWJlbCkpICU+JQogICAgZ2VuZXJhdGUocmVwcyA9IHJlcHMsIHR5cGUgPSAiYm9vdHN0cmFwIikgJT4lCiAgICBjYWxjdWxhdGUoc3RhdCA9ICJwcm9wIikgJT4lCiAgICBnZXRfY2kobGV2ZWwgPSBsZXZlbCkKICAKICBpZiAocHJpbnQpIHsgCiAgICBwcmludChpbnRlcnZhbCkKICAgIHByaW50KGMoaW50ZXJ2YWwkdXBwZXJfY2ksIGludGVydmFsJGxvd2VyX2NpKSAlPiUKICAgICAgICAgICAgZGVzY3JpYmUpCiAgfQogIAogIHJldHVybihpbnRlcnZhbCkKfQpgYGAKCmBgYHtyfQphbmFseXplU2FtcGxpbmdQcm9wb3J0aW9uRGlzdHJpYnV0aW9uIDwtIGZ1bmN0aW9uKHNhbXBsZSwgc2l6ZSA9IE5VTEwsIHJlcHMgPSAxNTAwMCwgYmlud2lkdGggPSAuMDEsIHllcyA9IFRSVUUpIHsKICBzaXplIDwtIGlmZWxzZShpcy5udWxsKHNpemUpLCBucm93KHNhbXBsZSksIHNpemUpCiAgICAKICBzaXplZFNhbXBsZXMgPC0gc2FtcGxlICU+JQogICAgcmVwX3NhbXBsZV9uKHNpemUgPSBzaXplLCByZXBzID0gcmVwcywgcmVwbGFjZSA9IFRSVUUpICU+JQogICAgY291bnQodGV4dF9pbmQpICU+JQogICAgbXV0YXRlKHBfaGF0ID0gbiAvc3VtKG4pKQogIAogIHR5cGVMYWJlbCA8LSBpZmVsc2UoeWVzLCB5ZXNMYWJlbCwgbm90TGFiZWwpCiAgCiAgZmlsdGVyZWRTYW1wbGVzIDwtIHNpemVkU2FtcGxlcyAlPiUKICAgIGZpbHRlcih0ZXh0X2luZCA9PSB0eXBlTGFiZWwpCiAgCiAgcHJpbnQoZ2dwbG90KGRhdGEgPSBmaWx0ZXJlZFNhbXBsZXMsIGFlcyh4ID0gcF9oYXQpKSArCiAgICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IGJpbndpZHRoKSArCiAgICBsYWJzKAogICAgICB4ID0gcGFzdGUoInBfaGF0ICgiLCB0eXBlTGFiZWwsICIpIiwgc2VwID0gIiIpLAogICAgICB0aXRsZSA9ICJTYW1wbGluZyBkaXN0cmlidXRpb24gb2YgcF9oYXQiLAogICAgICBzdWJ0aXRsZSA9IHBhc3RlKCJTYW1wbGUgc2l6ZSA9ICIsIHNpemUsICI7IE51bWJlciBvZiBzYW1wbGVzID0gIiwgcmVwcywgIjsgQmluIHdpZHRoID0gIiwgYmlud2lkdGgsIHNlcCA9ICIiKQogICAgKSkKICAKICBwcmludChmaWx0ZXJlZFNhbXBsZXMpCiAgcHJpbnQoZmlsdGVyZWRTYW1wbGVzJHBfaGF0ICU+JQogICAgZGVzY3JpYmUpCiAgCiAgcHJpbnQoc2l6ZWRTYW1wbGVzJG4gJT4lCiAgICBzdW0pCiAgCiAgcmV0dXJuKHNpemVkU2FtcGxlcykKfQpgYGAKCmBgYHtyfQphbmFseXplTWFyZ2luT2ZFcnJvciA8LSBmdW5jdGlvbihuLCBwLCBkZWNpbWFscyA9IDMpIHsKICBtZSA8LSAyICogc3FydChwICogKDEgLSBwKSAvIG4pCiAgcHJpbnQocGFzdGUoIk1hcmdpbiBvZiBFcnJvcjogIiwgbWUsIHNlcCA9ICIiKSkKICAKICBiaW53aWR0aCA9IDEvIDEwIF4gZGVjaW1hbHMKICBwTGlzdCA8LSBzZXEoZnJvbSA9IDAsIHRvID0gMSwgYnkgPSBiaW53aWR0aCkKICBtZUxpc3QgPC0gMiAqIHNxcnQocExpc3QgKiAoMSAtIHBMaXN0KSAvIG4pCgogIGRkIDwtIGRhdGEuZnJhbWUocHJvcG9ydGlvbiA9IHBMaXN0LCBtYXJnaW5PZkVycm9yID0gbWVMaXN0KQogIHByaW50KGdncGxvdChkYXRhID0gZGQsIGFlcyh4ID0gcHJvcG9ydGlvbiwgeSA9IG1hcmdpbk9mRXJyb3IpKSArCiAgICAgICAgICBnZW9tX3BvaW50KCkgKwogICAgICAgICAgZ2doaWdobGlnaHQocHJvcG9ydGlvbiA9PSByb3VuZChwLCBkaWdpdHMgPSBkZWNpbWFscyksIGxhYmVsX2tleSA9IG1hcmdpbk9mRXJyb3IpICsKICAgICAgICAgIGxhYnMoeCA9ICJQb3B1bGF0aW9uIFByb3BvcnRpb24iLCAKICAgICAgICAgICAgICAgeSA9ICJNYXJnaW4gb2YgRXJyb3IiLAogICAgICAgICAgICAgICB0aXRsZSA9IHBhc3RlKCJTYW1wbGUgc2l6ZSA9ICIsIG4sICI7IFByb3BvcnRpb24gPSAiLCBwLCAiOyBCaW4gd2lkdGggPSAiLCBiaW53aWR0aCwgc2VwID0gIiIpKSkKICAKICByZXR1cm4obWUpCn0KCmFuYWx5emVNYXJnaW5PZkVycm9yRGF0YSA8LSBmdW5jdGlvbihkYXRhLCByb3cgPSAieWVzIiwgIHNpemUgPSBOVUxMLCByZXBzID0gMTUwMDAsIGJpbndpZHRoID0gLjAxLCB5ZXMgPSBUUlVFLCBkaXN0cmlidXRlID0gVFJVRSkgewogIGZpbHRlcmVkRGF0YSA8LSBkYXRhICU+JQogICAgZ2V0UHJvcG9ydGlvbnMgJT4lCiAgICBmaWx0ZXIodGV4dF9pbmQgPT0gcm93KQogICAgCiAgbWUgPC0gYW5hbHl6ZU1hcmdpbk9mRXJyb3IoZmlsdGVyZWREYXRhW1syXV0sIGZpbHRlcmVkRGF0YVtbM11dKQogICAgCiAgaWYoZGlzdHJpYnV0ZSkgewogICAgcHJvcG9ydGlvbkRpc3RyaWJ1dGlvbiA8LSBkYXRhICU+JQogICAgICBhbmFseXplU2FtcGxpbmdQcm9wb3J0aW9uRGlzdHJpYnV0aW9uKHNpemUsIHJlcHMsIGJpbndpZHRoLCB5ZXMpCiAgfQogIAogIHJldHVybihtZSkKfQpgYGAKCmBgYHtyfQppbnRlcnZhbDk1IDwtIG5vX2hlbG1ldCAlPiUKICBhbmFseXplQ29uZmlkZW5jZUludGVydmFsCgpwcmludChub19oZWxtZXQpCm1lIDwtIG5vX2hlbG1ldCAlPiUKICBhbmFseXplTWFyZ2luT2ZFcnJvckRhdGEoZGlzdHJpYnV0ZSA9IEZBTFNFKQpgYGAKCiMjIyBFeGVyY2lzZSA2ClRoZSByZXN1bHRpbmcgZGlzdHJpYnV0aW9uIGlzIHVuaW1vZGFsIGFuZCB3aXRob3V0IGEgc2tldyBjZW50ZXJlZCBhcm91bmQgdGhlIGdpdmVuIHByb3BvcnRpb24KYGBge3J9Cm51bU9mRWxlbWVudHMgPSAzMDAKcHJvcG9ydGlvbiA9IC4xCgpkYXRhID0gdGliYmxlKAogIHRleHRfaW5kID0gYyhyZXAoeWVzTGFiZWwsIG51bU9mRWxlbWVudHMgKiBwcm9wb3J0aW9uKSwgcmVwKG5vTGFiZWwsIG51bU9mRWxlbWVudHMgKiAoMSAtIHByb3BvcnRpb24pKSkKKQoKCgptZSA8LSBkYXRhICU+JQogIGFuYWx5emVNYXJnaW5PZkVycm9yRGF0YQpgYGAKCiMjIyBFeGVyY2lzZSA3ClRoZSBzaGFwZSBhbmQgY2VudGVyIHJlbWFpbnMgZmFpcmx5IGNvbnNpc3RlbnQgYXMgdW5pbW9kYWwgYW5kIHdpdGhvdXQgYSBza2V3IGNlbnRlcmVkIGFyb3VuZCB0aGUgZ2l2ZW4gcHJvcG9ydGlvbiwgYnV0IHRoZSBtYXJnaW4gb2YgZXJyb3IgaW5jcmVhc2VzIHN0YXJ0aW5nIGZyb20gMCBhdCAwJSBwcm9wb3J0aW9uIHVudGlsIGl0IHJlYWNoZXMgNTAlIHdoZXJlIGl0IGFjaGlldmVzIGl0cyBtYXggYmVmb3JlIGRlY3JlYXNpbmcgYmFjayBkb3duIHRvIDAgYXQgMTAwJQpgYGB7cn0KbWluaXNjdWxlUHJvcG9ydGlvbiA9IC4wMQp0aW55UHJvcG9ydGlvbiA9IC4yCnNtYWxsUHJvcG9ydGlvbiA9IC40MAptZWRpdW1Qcm9wb3J0aW9uID0gLjYwCmxhcmdlUHJvcG9ydGlvbiA9IC44MAptYXNzaXZlUHJvcG9ydGlvbiA9IC45OQoKc21hbGxCaW53aWR0aCA9IC4wMDEKCm1pbmlzY3VsZURhdGEgPSB0aWJibGUoCiAgdGV4dF9pbmQgPSBjKHJlcCh5ZXNMYWJlbCwgbnVtT2ZFbGVtZW50cyAqIG1pbmlzY3VsZVByb3BvcnRpb24pLCByZXAobm9MYWJlbCwgbnVtT2ZFbGVtZW50cyAqICgxIC0gbWluaXNjdWxlUHJvcG9ydGlvbikpKQopCgp0aW55RGF0YSA9IHRpYmJsZSgKICB0ZXh0X2luZCA9IGMocmVwKHllc0xhYmVsLCBudW1PZkVsZW1lbnRzICogdGlueVByb3BvcnRpb24pLCByZXAobm9MYWJlbCwgbnVtT2ZFbGVtZW50cyAqICgxIC0gdGlueVByb3BvcnRpb24pKSkKKQogIApzbWFsbERhdGEgPSB0aWJibGUoCiAgdGV4dF9pbmQgPSBjKHJlcCh5ZXNMYWJlbCwgbnVtT2ZFbGVtZW50cyAqIHNtYWxsUHJvcG9ydGlvbiksIHJlcChub0xhYmVsLCBudW1PZkVsZW1lbnRzICogKDEgLSBzbWFsbFByb3BvcnRpb24pKSkKKQoKbWVkaXVtRGF0YSA9IHRpYmJsZSgKICB0ZXh0X2luZCA9IGMocmVwKHllc0xhYmVsLCBudW1PZkVsZW1lbnRzICogbWVkaXVtUHJvcG9ydGlvbiksIHJlcChub0xhYmVsLCBudW1PZkVsZW1lbnRzICogKDEgLSBtZWRpdW1Qcm9wb3J0aW9uKSkpCikKCmxhcmdlRGF0YSA9IHRpYmJsZSgKICB0ZXh0X2luZCA9IGMocmVwKHllc0xhYmVsLCBudW1PZkVsZW1lbnRzICogbGFyZ2VQcm9wb3J0aW9uKSwgcmVwKG5vTGFiZWwsIG51bU9mRWxlbWVudHMgKiAoMSAtIGxhcmdlUHJvcG9ydGlvbikpKQopCgptYXNzaXZlRGF0YSA9IHRpYmJsZSgKICB0ZXh0X2luZCA9IGMocmVwKHllc0xhYmVsLCBudW1PZkVsZW1lbnRzICogbWFzc2l2ZVByb3BvcnRpb24pLCByZXAobm9MYWJlbCwgbnVtT2ZFbGVtZW50cyAqICgxIC0gbWFzc2l2ZVByb3BvcnRpb24pKSkKKQoKCgptZSA8LSBtaW5pc2N1bGVEYXRhICU+JQogIGFuYWx5emVNYXJnaW5PZkVycm9yRGF0YShiaW53aWR0aCA9IHNtYWxsQmlud2lkdGgpCgptZSA8LSB0aW55RGF0YSAlPiUKICBhbmFseXplTWFyZ2luT2ZFcnJvckRhdGEKCm1lIDwtIHNtYWxsRGF0YSAlPiUKICBhbmFseXplTWFyZ2luT2ZFcnJvckRhdGEKCm1lIDwtIG1lZGl1bURhdGEgJT4lCiAgYW5hbHl6ZU1hcmdpbk9mRXJyb3JEYXRhCgptZSA8LSBsYXJnZURhdGEgJT4lCiAgYW5hbHl6ZU1hcmdpbk9mRXJyb3JEYXRhCgptZSA8LSBtYXNzaXZlRGF0YSAlPiUKICBhbmFseXplTWFyZ2luT2ZFcnJvckRhdGEoYmlud2lkdGggPSBzbWFsbEJpbndpZHRoKQpgYGAKCiMjIyBFeGVyY2lzZSA4ClRoZSBtYXJnaW4gb2YgZXJyb3IgZGVjcmVhc2VzIGFzIG4gaW5jcmVhc2VzCmBgYHtyfQp0aW55TnVtT2ZFbGVtZW50cyA9IDEwCnNtYWxsTnVtT2ZFbGVtZW50cyA9IDUwCm1lZGl1bU51bU9mRWxlbWVudHMgPSAxMDAKbGFyZ2VOdW1PZkVsZW1lbnRzID0gMTAwMAptYXNzaXZlTnVtT2ZFbGVtZW50cyA9IDEwMDAwCgpsYXJnZUJpbndpZHRoID0gLjEKbWVkaXVtQmlud2lkdGggPSAuMDIKCnRpbnlEYXRhID0gdGliYmxlKAogIHRleHRfaW5kID0gYyhyZXAoeWVzTGFiZWwsIHRpbnlOdW1PZkVsZW1lbnRzICogcHJvcG9ydGlvbiksIHJlcChub0xhYmVsLCB0aW55TnVtT2ZFbGVtZW50cyAqICgxIC0gcHJvcG9ydGlvbikpKQopCiAgCnNtYWxsRGF0YSA9IHRpYmJsZSgKICB0ZXh0X2luZCA9IGMocmVwKHllc0xhYmVsLCBzbWFsbE51bU9mRWxlbWVudHMgKiBwcm9wb3J0aW9uKSwgcmVwKG5vTGFiZWwsIHNtYWxsTnVtT2ZFbGVtZW50cyAqICgxIC0gcHJvcG9ydGlvbikpKQopCgptZWRpdW1EYXRhID0gdGliYmxlKAogIHRleHRfaW5kID0gYyhyZXAoeWVzTGFiZWwsIG1lZGl1bU51bU9mRWxlbWVudHMgKiBwcm9wb3J0aW9uKSwgcmVwKG5vTGFiZWwsIG1lZGl1bU51bU9mRWxlbWVudHMgKiAoMSAtIHByb3BvcnRpb24pKSkKKQoKbGFyZ2VEYXRhID0gdGliYmxlKAogIHRleHRfaW5kID0gYyhyZXAoeWVzTGFiZWwsIGxhcmdlTnVtT2ZFbGVtZW50cyAqIHByb3BvcnRpb24pLCByZXAobm9MYWJlbCwgbGFyZ2VOdW1PZkVsZW1lbnRzICogKDEgLSBwcm9wb3J0aW9uKSkpCikKCm1hc3NpdmVEYXRhID0gdGliYmxlKAogIHRleHRfaW5kID0gYyhyZXAoeWVzTGFiZWwsIG1hc3NpdmVOdW1PZkVsZW1lbnRzICogcHJvcG9ydGlvbiksIHJlcChub0xhYmVsLCBtYXNzaXZlTnVtT2ZFbGVtZW50cyAqICgxIC0gcHJvcG9ydGlvbikpKQopCgoKCm1lIDwtIHRpbnlEYXRhICU+JQogIGFuYWx5emVNYXJnaW5PZkVycm9yRGF0YShiaW53aWR0aCA9IGxhcmdlQmlud2lkdGgpCgptZSA8LSBzbWFsbERhdGEgJT4lCiAgYW5hbHl6ZU1hcmdpbk9mRXJyb3JEYXRhKGJpbndpZHRoID0gbWVkaXVtQmlud2lkdGgpCgptZSA8LSBtZWRpdW1EYXRhICU+JQogIGFuYWx5emVNYXJnaW5PZkVycm9yRGF0YQoKbWUgPC0gbGFyZ2VEYXRhICU+JQogIGFuYWx5emVNYXJnaW5PZkVycm9yRGF0YShiaW53aWR0aCA9IHNtYWxsQmlud2lkdGgpCgptZSA8LSBtYXNzaXZlRGF0YSAlPiUKICBhbmFseXplTWFyZ2luT2ZFcnJvckRhdGEoYmlud2lkdGggPSBzbWFsbEJpbndpZHRoKQpgYGAKCiMjIyBFeGVyY2lzZSA5Ck9mIHRob3NlIHRoYXQgc2xlZXAgbW9yZSB0aGFuIDEwIGhvdXJzLCB3ZSBjYW4gc2F5IHdpdGggOTUlIGNvbmZpZGVuY2UgdGhhdCBhYm91dCAyNyUgb2YgdGhlbSB3b3JrIG91dCBldmVyeSBkYXkuIFRoaXMgaXMgYSBzaWduaWZpY2FudCByZWxhdGlvbnNoaXAgZ2l2ZW4gdGhhdCB0aGUgb25seSBvdGhlciBwcmV2YWxlbnQgcGF0dGVybiBvYnNlcnZlZCBpcyAwIGRheXMgYXQgMzElLgoKSG86IFRob3NlIHdobyBzbGVlcCAxMCsgaG91cnMgcGVyIGRheSBhcmUgTk9UIG1vcmUgbGlrZWx5IHRvIHN0cmVuZ3RoIHRyYWluIGV2ZXJ5IGRheSBvZiB0aGUgd2VlawpIYTogVGhvc2Ugd2hvIHNsZWVwIDEwKyBob3VycyBwZXIgZGF5IGFyZSBtb3JlIGxpa2VseSB0byBzdHJlbmd0aCB0cmFpbiBldmVyeSBkYXkgb2YgdGhlIHdlZWsKYGBge3J9CnR5cGU3ID0gIjciCnR5cGUxMFBsdXMgPC0gIjEwKyIKYmlud2lkdGggPSAuMDAwMwoKCgojZXhlcmNpc2VFdmVyeWRheSA8LSB5cmJzcyAlPiUKIyAgbXV0YXRlKHRleHRfaW5kID0gaWZlbHNlKCFpcy5uYShzdHJlbmd0aF90cmFpbmluZ183ZCkKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICYgc3RyZW5ndGhfdHJhaW5pbmdfN2QgPT0gdHlwZTcsIHllc0xhYmVsLCBub0xhYmVsKSkKIwojZXhlcmNpc2VFdmVyeWRheU1hcmdpbk9mRXJyb3IgPC0gZXhlcmNpc2VFdmVyeWRheSAlPiUKIyAgYW5hbHl6ZU1hcmdpbk9mRXJyb3JEYXRhKGJpbndpZHRoID0gYmlud2lkdGgpCiMKI2V4ZXJjaXNlRXZlcnlkYXlDb25maWRlbmNlSW5lcnZhbCA8LSBleGVyY2lzZUV2ZXJ5ZGF5ICU+JQojICBhbmFseXplQ29uZmlkZW5jZUludGVydmFsCgoKCgojc2xlZXAxME9yTW9yZUhvdXJzIDwtIHlyYnNzICU+JQojICBtdXRhdGUodGV4dF9pbmQgPSBpZmVsc2UoIWlzLm5hKHNjaG9vbF9uaWdodF9ob3Vyc19zbGVlcCkKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICYgc2Nob29sX25pZ2h0X2hvdXJzX3NsZWVwID09IHR5cGUxMFBsdXMsIHllc0xhYmVsLCBub0xhYmVsKSkKIwojc2xlZXAxME9yTW9yZUhvdXJzTWFyZ2luT2ZFcnJvciA8LSBzbGVlcDEwT3JNb3JlSG91cnMgJT4lCiMgIGFuYWx5emVNYXJnaW5PZkVycm9yRGF0YShiaW53aWR0aCA9IGJpbndpZHRoKQojCiNzbGVlcDEwT3JNb3JlSG91cnNDb25maWRlbmNlSW5lcnZhbCA8LSBzbGVlcDEwT3JNb3JlSG91cnMgJT4lCiMgIGFuYWx5emVDb25maWRlbmNlSW50ZXJ2YWwKCgoKZXhlcmNpc2VFdmVyeWRheUFuZFNsZWVwMTBPck1vcmVIb3VycyA8LSB5cmJzcyAlPiUKICBmaWx0ZXIoc3RyZW5ndGhfdHJhaW5pbmdfN2QgPT0gdHlwZTcpICU+JQogIG11dGF0ZSh0ZXh0X2luZCA9IGlmZWxzZSghaXMubmEoc2Nob29sX25pZ2h0X2hvdXJzX3NsZWVwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAmIHNjaG9vbF9uaWdodF9ob3Vyc19zbGVlcCA9PSB0eXBlMTBQbHVzLCB5ZXNMYWJlbCwgbm9MYWJlbCkpCgpleGVyY2lzZUV2ZXJ5ZGF5QW5kU2xlZXAxME9yTW9yZUhvdXJzTWFyZ2luT2ZFcnJvciA8LSBleGVyY2lzZUV2ZXJ5ZGF5QW5kU2xlZXAxME9yTW9yZUhvdXJzICU+JQogIGFuYWx5emVNYXJnaW5PZkVycm9yRGF0YShiaW53aWR0aCA9IHNtYWxsQmlud2lkdGgpCgpleGVyY2lzZUV2ZXJ5ZGF5QW5kU2xlZXAxME9yTW9yZUhvdXJzQ29uZmlkZW5jZUluZXJ2YWwgPC0gZXhlcmNpc2VFdmVyeWRheUFuZFNsZWVwMTBPck1vcmVIb3VycyAlPiUKICBhbmFseXplQ29uZmlkZW5jZUludGVydmFsCgoKCnNsZWVwMTBPck1vcmVIb3Vyc0FuZEV4ZXJjaXNlRXZlcnlkYXkgPC0geXJic3MgJT4lCiAgZmlsdGVyKHNjaG9vbF9uaWdodF9ob3Vyc19zbGVlcCA9PSB0eXBlMTBQbHVzKSAlPiUKICBtdXRhdGUodGV4dF9pbmQgPSBpZmVsc2UoIWlzLm5hKHN0cmVuZ3RoX3RyYWluaW5nXzdkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAmIHN0cmVuZ3RoX3RyYWluaW5nXzdkID09IHR5cGU3LCB5ZXNMYWJlbCwgbm9MYWJlbCkpCgpzbGVlcDEwT3JNb3JlSG91cnNBbmRFeGVyY2lzZUV2ZXJ5ZGF5TWFyZ2luT2ZFcnJvciA8LSBzbGVlcDEwT3JNb3JlSG91cnNBbmRFeGVyY2lzZUV2ZXJ5ZGF5ICU+JQogIGFuYWx5emVNYXJnaW5PZkVycm9yRGF0YQoKc2xlZXAxME9yTW9yZUhvdXJzQW5kRXhlcmNpc2VFdmVyeWRheUNvbmZpZGVuY2VJbmVydmFsIDwtIHNsZWVwMTBPck1vcmVIb3Vyc0FuZEV4ZXJjaXNlRXZlcnlkYXkgJT4lCiAgYW5hbHl6ZUNvbmZpZGVuY2VJbnRlcnZhbAoKc2xlZXAxME9yTW9yZUhvdXJzQW5kRXhlcmNpc2VFdmVyeWRheSAlPiUKICAgIHNlbGVjdChzdHJlbmd0aF90cmFpbmluZ183ZCkgJT4lCiAgICBjb3VudChzdHJlbmd0aF90cmFpbmluZ183ZCkgJT4lCiAgICBtdXRhdGUocCA9IG4gLyBzdW0obikpICU+JQogICAgc2VsZWN0KHN0cmVuZ3RoX3RyYWluaW5nXzdkLCBuLCBwKQpgYGAKCiMjIyBFeGVyY2lzZSAxMApUaGUgbnVsbCBoeXBvdGhlc2lzIGlzIHJlamVjdGVkIHdoZW4gdGhlIHAgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaWduaWZpY2FuY2UgbGV2ZWwsIHdoaWNoIGluIHRoaXMgY2FzZSBpcyAuMDUsIG9yIDUlLiBJdCByZXByZXNlbnRzIGhvdyBvZnRlbiB3ZSBtaWdodCBtaXN0YWtlbmx5IGFjY2VwdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGluIHRoaXMgc2NlbmFyaW8KCiMjIyBFeGVyY2lzZSAxMQpVc2luZyBhIHByb3BvcnRpb24gb2YgNTAlIHRvIGdldCB0aGUgaGlnaGVzdCBwb3NzaWJsZSBzYW1wbGUgc2l6ZSBhbmQgYSBtYXJnaW4gb2YgZXJyb3Igb2YgMSUsIG91ciBpZGVhbCBzYW1wbGUgc2l6ZSB3b3VsZCBiZSA5NjA0CmBgYHtyfQooKDEuOTYgXiAyKSAqICgwLjUgKiAwLjUpKSAvIDAuMDEgXiAyIApgYGA=